import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
    state: {
        role: [], //  用户角色信息的数组
        detailData: [], //  详情数据的数组
        orderId: 0, //  订单 ID，初始值为 0
        changedOrderId: 0, //  变更后的订单 ID，初始值为 0
        changedKnowledgeId: 0, //  变更后的知识 ID，初始值为 0
        user: '', //  用户信息的字符串
        loginUserNickname: '', //  登录用户昵称的字符串
        loginUserAvatar: '', //  登录用户头像信息的字符串
        activeIndex: '1', //  当前激活的导航索引，初始值为 '1'
        publishActiveIndex: '1', //  发布页面激活的导航索引，初始值为 '1'
        userActiveIndex: '1-1', //  用户页面激活的导航索引，初始值为 '1-1'
        // 从 localStorage 中获取 token，如果存在则使用，不存在则为空字符串
        token: localStorage.getItem('token') ? localStorage.getItem('token') : '',
        paymentInfo: '', //  支付信息的字符串
        imgShowRoad: process.env.VUE_APP_Address, //  图片显示的基础路径，从环境变量获取
        fileUploadRoad: process.env.VUE_APP_Address, //  文件上传的基础路径，从环境变量获取
        mutiFile: '', //  多文件相关信息的字符串
    },
    // getters 用于从 state 中派生出一些状态，类似于计算属性，可对 state 中的数据进行处理后返回
    getters: {
        /**
         * 从本地 中获取 token 并更新 state 中的 token
         * @param {Object} state - 当前的 state 对象
         * @returns {string|null} - 返回更新后的 token，如果没有则返回 null
         */
        getStorage(state) {
            // 检查 state 中的 token 是否为空
            if (!state.token) {
                // 注意：这里的 key 未定义，可能是想使用 'token'，建议修正
                state.token = JSON.parse(localStorage.getItem(key))
                return state.token
            }
        },
        /**
         * 判断用户是否具有专家角色
         * @param {Object} state - 当前的 state 对象
         * @returns {boolean} - 如果用户是专家角色返回 true，否则返回 false
         */
        isExpert(state) {
            // 遍历 state 中的 role 数组
            for (var k in state.role) {
                // 检查是否存在 authority 为 'expert' 的角色
                if (state.role[k].authority === "expert") {
                    return true
                }
            }
            return false
        },
        /**
         * 判断用户是否具有管理员角色
         * @param {Object} state - 当前的 state 对象
         * @returns {boolean} - 如果用户是管理员角色返回 true，否则返回 false
         */
        isAdmin(state) {
            // 遍历 state 中的 role 数组
            for (var k in state.role) {
                // 检查是否存在 authority 为 'admin' 的角色
                if (state.role[k].authority === "admin") {
                    return true
                }
            }
            return false
        },
    },
    // mutations 用于同步修改 state 中的状态，每个 mutation 都是一个函数，接收 state 和 payload 作为参数
    mutations: {
        /**
         * 更新订单 ID
         * @param {Object} state - 当前的 state 对象
         * @param {number} value - 新的订单 ID
         */
        updateOrderId(state, value) {
            state.orderId = value
        },
        /**
         * 更新详情数据
         * @param {Object} state - 当前的 state 对象
         * @param {any} value - 新的详情数据
         */
        updateDetailData(state, value) {
            state.detailData = value
            // 打印更新后的详情数据
            console.log('state.detailData', state.detailData)
        },
        /**
         * 更新变更后的订单 ID
         * @param {Object} state - 当前的 state 对象
         * @param {number} value - 新的变更后订单 ID
         */
        updateChangedOrderId(state, value) {
            state.changedOrderId = value
        },
        /**
         * 更新变更后的知识 ID
         * @param {Object} state - 当前的 state 对象
         * @param {number} value - 新的变更后知识 ID
         */
        updateChangedKnowledgeId(state, value) {
            state.changedKnowledgeId = value
        },
        /**
         * 更新登录用户的昵称
         * @param {Object} state - 当前的 state 对象
         * @param {string} value - 新的登录用户昵称
         */
        updateLoginUserNickname(state, value) {
            // 打印更新前和更新后的登录用户昵称
            console.log('state.loginUserNickname', value, state.loginUserNickname)
            state.loginUserNickname = value
        },
        /**
         * 更新登录用户的头像
         * @param {Object} state - 当前的 state 对象
         * @param {string} value - 新的登录用户头像
         */
        updateLoginUserAvatar(state, value) {
            state.loginUserAvatar = value
        },
        /**
         * 更新用户角色列表
         * @param {Object} state - 当前的 state 对象
         * @param {Array} value - 新的用户角色列表
         */
        updateRole(state, value) {
            state.role = value
        },
        /**
         * 更新支付信息
         * @param {Object} state - 当前的 state 对象
         * @param {any} value - 新的支付信息
         */
        updatePaymentInfo(state, value) {
            state.paymentInfo = value
        },
        /**
         * 更新当前激活的导航索引
         * @param {Object} state - 当前的 state 对象
         * @param {string} value - 新的激活导航索引
         */
        updateActiveIndex(state, value) {
            state.activeIndex = value
        },
        /**
         * 更新发布页面的激活导航索引
         * @param {Object} state - 当前的 state 对象
         * @param {string} value - 新的发布页面激活导航索引
         */
        updatePublishActiveIndex(state, value) {
            state.publishActiveIndex = value
        },
        /**
         * 更新用户页面的激活导航索引
         * @param {Object} state - 当前的 state 对象
         * @param {string} value - 新的用户页面激活导航索引
         */
        updateUserActiveIndex(state, value) {
            state.userActiveIndex = value
        },
        /**
         * 设置  token
         * @param {Object} state - 当前的 state 对象
         * @param {string} value - 新的 token
         */
        setToken(state, value) {
            state.token = value
            // 将新的 token  到 localStorage 中
            localStorage.setItem('token', value)
        },
        /**
         * 删除本地 中的 token
         * @param {Object} state - 当前的 state 对象
         */
        removeStorage(state) {
            // 从 localStorage 中移除 token
            localStorage.removeItem('token')
        }
    },
    // actions 用于处理异步操作，通过提交 mutations 来间接修改 state
    actions: {},
    // modules 用于将 Vuex  拆分为多个模块，每个模块有自己的 state、mutations、actions 和 getters
    modules: {}
})